package controle;

import java.util.List;

import modelo.bean.Aluno;
import modelo.bean.Professor;
import modelo.bean.Usuario;
import modelo.dao.GenericoDAO;
import modelo.dao.impl.AlunoDAOImpl;
import modelo.dao.impl.ProfessorDAOImpl;
import modelo.dao.impl.UsuarioDAOImpl;

public class UsersAllControllers {

	private Usuario usuario;
	private Aluno aluno;
	private Professor professor;

	private List<Aluno> listaDeAlunos;
	private List<Usuario> listaDeUsuarios;
	private List<Professor> listaDeProfessores;
	
	private UsuarioDAOImpl usuarioDAOImpl;
	private AlunoDAOImpl alunoDAOImpl;
	private ProfessorDAOImpl professorDAOImpl;

	private GenericoDAO genericoDAO;

	public UsersAllControllers(Usuario usuario) {
		this.usuario = usuario;
		DAOdeUser();
	}
	public boolean criarUsuario() {
		DAOdeUser();
		return genericoDAO.criar();

	}
	public boolean criarAluno() {
		DAOdeAluno();
		return genericoDAO.criar();

	}
	public boolean criarProfessor() {
		DAOdeProfessor();
		return genericoDAO.criar();

	}

	public Object find(Long id) {
		Object o = genericoDAO.recuperar(id);
		return setObjeto(o);
	}

	public Object autenticar(String matricula, String senha){
		DAOdeUser();
		UsuarioDAOImpl u =(UsuarioDAOImpl) genericoDAO;
		Object o = u.autentica(matricula, senha);
		return setObjeto(o);
	}
	
	private Object setObjeto(Object o) {
		if (o instanceof Aluno) {
			aluno = (Aluno) o;
			
			System.out.println("Aluno");
			System.out.println(aluno.getEmail());
			System.out.println(aluno.getSemestre());
			System.out.println(aluno.getMatricula());
			return aluno;
		} else if (o instanceof Professor) {
			professor = (Professor) o;
			System.out.println("Professor");
			System.out.println(professor.getEmail());
			System.out.println(professor.getTitulo());
			System.out.println(professor.getMatricula());
			return professor;
		} else if (o instanceof Usuario) {
			usuario = (Usuario) o;
			System.out.println("Usuario");
			System.out.println(usuario.getEmail());
			System.out.println(usuario.getMatricula());
			return usuario;
		}else{
			System.out.println("Nenhum instance");
		}
		return null;
	}
	
	@SuppressWarnings("unchecked")
	public List<Aluno> listarTodosAlunos(){
		DAOdeAluno();
		return (List<Aluno>)genericoDAO.listarTodos();
	}
	
	@SuppressWarnings("unchecked")
	public List<Professor> listarTodosProfessores(){
		DAOdeProfessor();
		return (List<Professor>)genericoDAO.listarTodos();
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> listarTodosUsuarios(){
		DAOdeUser();
		return (List<Usuario>)genericoDAO.listarTodos();
	}
	
	public boolean excluir(Long id){
		usuario = (Usuario) genericoDAO.recuperar(id);
		DAOdeUser();
		return genericoDAO.deletar();
	}
	
	public boolean alterarAluno(Aluno a){
		aluno =a;
		DAOdeAluno();
		return genericoDAO.editar();
	}
	
	public boolean alterarProfessor(Professor p){
		professor =p;
		DAOdeProfessor();
		return genericoDAO.editar();
	}

	private void DAOdeUser() {
		if (usuario == null) {
			usuario = new Usuario();
		}if (usuarioDAOImpl ==null) {
			usuarioDAOImpl = new UsuarioDAOImpl(usuario);
		}
		genericoDAO = usuarioDAOImpl;
		genericoDAO.changeSeed(usuario);
		

	}

	private void DAOdeAluno() {
		if (aluno == null) {
			aluno = new Aluno();

		}if (alunoDAOImpl ==null) {
			alunoDAOImpl = new AlunoDAOImpl(aluno);
		}
		genericoDAO = alunoDAOImpl;
		genericoDAO.changeSeed(aluno);

	}

	private void DAOdeProfessor() {
		if (professor == null) {
			professor = new Professor();
		}if (professorDAOImpl ==null) {
			professorDAOImpl = new ProfessorDAOImpl(professor);
		}
		System.out.println("DAOdeProfessor: "+professor.getNome());
		genericoDAO = professorDAOImpl;
		genericoDAO.changeSeed(professor);
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Aluno getAluno() {
		return aluno;
	}

	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}

	public Professor getProfessor() {
		return professor;
	}

	public void setProfessor(Professor professor) {
		this.professor = professor;
	}

	public List<Aluno> getListaDeAlunos() {
		return listaDeAlunos;
	}

	public void setListaDeAlunos(List<Aluno> listaDeAlunos) {
		this.listaDeAlunos = listaDeAlunos;
	}

	public List<Usuario> getListaDeUsuarios() {
		return listaDeUsuarios;
	}

	public void setListaDeUsuarios(List<Usuario> listaDeUsuarios) {
		this.listaDeUsuarios = listaDeUsuarios;
	}

	public List<Professor> getListaDeProfessores() {
		return listaDeProfessores;
	}

	public void setListaDeProfessores(List<Professor> listaDeProfessores) {
		this.listaDeProfessores = listaDeProfessores;
	}


}
